import router, { asyncRoutes } from './router'
import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
// 导入网页标题
import getPageTitle from '@/utils/get-page-title'

// 白名单
const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  console.log('to去哪里', to)
  console.log('from从哪里来', from)
  // 修改网页标题
  const title = getPageTitle(to.meta.title)
  document.title = title
  // 判断是否登录, 是否有token
  const token = store.state.user.token
  if (token) {
    // 已登录
    if (to.path === '/login') {
      console.log('已登录, 去登录页无效')
      next('/')
      NProgress.done() // 关闭进度条
    } else {
      // 存储用户信息
      // 判断用户在此之前是否已经获取过用户信息, 如果获取过, 就可以不用再次请求
      let menus = []
      if (!store.getters.userId) {
        // 如果没有获取过用户信息就重新发送请求
        menus = await store.dispatch('user/getUserInfo')
        // menus 用户可以访问的页面的权限信息
        console.log('menus', menus)
        // 根据权限信息渲染左侧菜单和动态添加路由
        const filterRoutes = asyncRoutes.filter(item => {
          return menus.includes(item.children[0].name)
        })
        // 在动态路由最后面最加404
        // 404 page must be placed at the end !!!
        filterRoutes.push({ path: '*', redirect: '/404', hidden: true })
        console.log('filterRoutes', filterRoutes)
        // 获取动态路由对象
        console.log('asyncRoutes', asyncRoutes)
        // 把动态路由表添加到vuex中
        store.commit('menus/updateMenus', filterRoutes)
        // 创建动态路由
        router.addRoutes(filterRoutes)
        // 动态添加路由是异步, 如果说页面没有加载完成直接跳转页面会出现白屏
        // 解决方案: next({ ...to, replace: true }) // replace: true 重新进入页面重新加载
        console.log('已登录, 放行')
        next({ ...to, replace: true })
      } else {
        next()
      }
    }
  } else {
    // 未登录
    if (whiteList.includes(to.path)) {
      console.log('拥有白名单, 放行')
      next()
    } else {
      console.log('未有白名单, 跳转到登录页')
      next('/login') // 关闭进度条
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done() // 关闭进度条
})
